import router from "@/router/index.js";
import store from './store'
import {Message} from 'element-ui'
import NProgress from 'nprogress'
import {getToken} from '@/utils/auth'

/**
 * 路径匹配器
 * @param {string} pattern
 * @param {string} path
 * @returns {Boolean}
 */
export function isPathMatch(pattern, path) {
    const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*')
    const regex = new RegExp(`^${regexPattern}$`)
    return regex.test(path)
}

// 是否显示重新登录
let isRelogin = {show: false};

// 白名单
const whiteList = ['/login', '/register']

const isWhiteList = (path) => {
    return whiteList.some(pattern => isPathMatch(pattern, path))
}

router.beforeEach((to, from, next) => {
    NProgress.start()
    // 1. 判断token是否存在
    if (getToken()) {
        // 2. 判断进入页面是否是登录页面
        if (to.path === '/login') {
            next({path: '/'})
            NProgress.done()
            // 3. 判断进入页面是否是白名单
        } else if (isWhiteList(to.path)) {
            next()
        } else {
            // 4. 判断当前用户是否已拉取完user_info信息
            if (store.getters.roles.length === 0) {
                // 未拉取用户信息需要重新登录
                isRelogin.show = true
                // 判断当前用户是否已拉取完user_info信息
                store.dispatch('GetInfo').then(() => {
                    isRelogin.show = false
                    store.dispatch('GenerateRoutes').then(accessRoutes => {
                        // 根据roles权限生成可访问的路由表
                        router.addRoutes(accessRoutes) // 动态添加可访问路由表
                        next({...to, replace: true}) // hack方法 确保addRoutes已完成
                    })
                }).catch(err => {
                    store.dispatch('LogOut').then(() => {
                        Message.error(err)
                        next({path: '/'})
                    })
                })
            } else {
                next()
            }
        }
    } else {
        // 没有token
        if (isWhiteList(to.path)) {
            // 在免登录白名单，直接进入
            next()
        } else {
            next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页
            NProgress.done()
        }
    }
})

router.afterEach(() => {
    NProgress.done()
})
